home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / UTILITY1 / MSWLGO35.ZIP / EXAMPLES / MATH < prev    next >
Text File  |  1993-04-12  |  7KB  |  259 lines

  1. ;
  2. ; Function:
  3. ;
  4. ; Logic analysis program (very powerful)
  5. ;
  6. ; To run:
  7. ;
  8. ; load "math
  9. ; Call PROBLEM
  10. ;
  11. ; You can write your own "problems" using PROBLEM as a template.
  12. ;
  13. TO CATEGORY :NAME :MEMBERS
  14. PRINT (LIST "CATEGORY :NAME :MEMBERS)
  15. IF NOT NAMEP "CATEGORIES [MAKE "CATEGORIES []]
  16. MAKE "CATEGORIES LPUT :NAME :CATEGORIES
  17. MAKE :NAME :MEMBERS
  18. FOREACH :MEMBERS [PPROP ? "CATEGORY :NAME]
  19. END
  20.  
  21. TO CHOOSE :N :R
  22. OUTPUT (PERMS :N :R)/(FACT :R)
  23. END
  24.  
  25. TO CLEAN1 :CATEGORY
  26. FOREACH THING :CATEGORY [ERPL ?]
  27. ERN :CATEGORY
  28. END
  29.  
  30. TO CLEANUP
  31. FOREACH :CATEGORIES [CLEAN1 ?]
  32. ERN "CATEGORIES
  33. END
  34.  
  35. TO COMBS :LIST :HOWMANY
  36. IF EQUALP :HOWMANY 0 [OP [[]]]
  37. IF EQUALP :HOWMANY COUNT :LIST [OP (LIST :LIST)]
  38. OP SE (MAP [FPUT FIRST :LIST ?] COMBS (BF :LIST) (:HOWMANY-1)) ~
  39.       (COMBS (BF :LIST) :HOWMANY)
  40. END
  41.  
  42. TO DIFFER :LIST
  43. PRINT (LIST "DIFFER :LIST)
  44. FOREACH :LIST [DIFFER1 ? ?REST]
  45. END
  46.  
  47. TO DIFFER1 :WHO :THEM
  48. FOREACH :THEM ~
  49.         [IF NOT EQUALP (GPROP :WHO "CATEGORY) (GPROP ? "CATEGORY) ~
  50.             [FALSIFY :WHO ?]]
  51. END
  52.  
  53. TO EXPAND :LIST
  54. IF EMPTYP :LIST [OP []]
  55. IF NUMBERP FIRST :LIST ~
  56.    [OP CASCADE (FIRST :LIST) [FPUT FIRST BF :LIST ?] (EXPAND BF BF :LIST)]
  57. OP FPUT FIRST :LIST EXPAND BF :LIST
  58. END
  59.  
  60. TO F :N
  61. IF EQUALP :N 0 [OUTPUT 1]
  62. OUTPUT CASCADE :N [? + ((CHOOSE :N (#-1)) * F (#-1))] 0
  63. END
  64.  
  65. TO FACT :N
  66. OUTPUT CASCADE :N [# * ?] 1
  67. END
  68.  
  69. TO FALSES :WHO :WHAT
  70. OUTPUT COUNT FILTER [EQUALP "FALSE GET ? :WHAT] PEERS :WHO
  71. END
  72.  
  73. TO FALSIFY :WHO :WHAT
  74. LOCAL "OLDVALUE
  75. MAKE "OLDVALUE GET :WHO :WHAT
  76. IF EQUALP :OLDVALUE "FALSE [STOP]
  77. IF EQUALP :OLDVALUE "TRUE ~
  78.    [PR (SE [INCONSISTENCY FALSIFYING] :WHO "IS :WHAT) THROW "TOPLEVEL]
  79. PR (LIST "FALSIFY :WHO :WHAT)
  80. STORE :WHO :WHAT "FALSE
  81. IF NOT EMPTYP :OLDVALUE [LINKFALSE :OLDVALUE]
  82. IF EQUALP (COUNT PEERS :WHO) (1+FALSES :WHO :WHAT) [FINDTRUE :WHO :WHAT]
  83. IF EQUALP (COUNT PEERS :WHAT) (1+FALSES :WHAT :WHO) [FINDTRUE :WHAT :WHO]
  84. FOREACH (GPROP :WHO "TRUTH) [MAYBEFALSIFY ? :WHAT]
  85. FOREACH (GPROP :WHAT "TRUTH) [MAYBEFALSIFY :WHO ?]
  86. PPROP :WHO "FALSEHOOD (FPUT :WHAT GPROP :WHO "FALSEHOOD)
  87. PPROP :WHAT "FALSEHOOD (FPUT :WHO GPROP :WHAT "FALSEHOOD)
  88. END
  89.  
  90. TO FINDFALSE :THEM :WHAT
  91. FOREACH (FILTER [NOT EQUALP GET ? :WHAT "TRUE] :THEM) [FALSIFY ? :WHAT]
  92. END
  93.  
  94. TO FINDTRUE :WHO :WHAT
  95. VERIFY (FIND [NOT EQUALP "FALSE GET ? :WHAT] PEERS :WHO) :WHAT
  96. END
  97.  
  98. TO GET :A :B
  99. OUTPUT GETINORDER :A :B :CATEGORIES
  100. END
  101.  
  102. TO GETINORDER :A :B :ORDER
  103. IF EMPTYP :ORDER [PRINT (SE [UNKNOWN OBJECTS] :A :B) THROW "TOPLEVEL]
  104. IF MEMBERP :A THING FIRST :ORDER [OUTPUT GPROP :A :B]
  105. IF MEMBERP :B THING FIRST :ORDER [OUTPUT GPROP :B :A]
  106. OUTPUT GETINORDER :A :B BF :ORDER
  107. END
  108.  
  109. TO LINK :WHO :WHAT1 :WHAT2
  110. LOCAL "OLDVALUE
  111. MAKE "OLDVALUE GET :WHO :WHAT1
  112. IF EMPTYP :OLDVALUE [STORE :WHO :WHAT1 (LIST :WHO :WHAT2) STOP]
  113. IF EQUALP :OLDVALUE "TRUE [FALSIFY :WHO :WHAT2 STOP]
  114. IF EQUALP :OLDVALUE "FALSE [VERIFY :WHO :WHAT2 STOP]
  115. STORE :WHO :WHAT1 (SE :OLDVALUE :WHO :WHAT2)
  116. END
  117.  
  118. TO LINKFALSE :LIST
  119. IF EMPTYP :LIST [STOP]
  120. VERIFY (FIRST :LIST) (FIRST BF :LIST)
  121. LINKFALSE BF BF :LIST
  122. END
  123.  
  124. TO LINKTRUE :LIST
  125. IF EMPTYP :LIST [STOP]
  126. FALSIFY (FIRST :LIST) (FIRST BF :LIST)
  127. LINKTRUE BF BF :LIST
  128. END
  129.  
  130. TO LOCK1 :TOTAL :BUTTONS
  131. LOCAL "PERMS
  132. MAKE "PERMS PERMS :TOTAL :BUTTONS
  133. OUTPUT CASCADE (TWOTO (:BUTTONS-1)) [? + LOCK2 :PERMS #-1 1] 0
  134. END
  135.  
  136. TO LOCK2 :PERMS :LINKS :FACTOR
  137. IF EQUALP :LINKS 0 [OUTPUT :PERMS/(FACT :FACTOR)]
  138. IF EQUALP (REMAINDER :LINKS 2) 0 [OUTPUT LOCK2 :PERMS/(FACT :FACTOR) :LINKS/2 1]
  139. OUTPUT LOCK2 :PERMS (:LINKS-1)/2 :FACTOR+1
  140. END
  141.  
  142. TO LOCK :BUTTONS
  143. OUTPUT CASCADE :BUTTONS [? + LOCK1 :BUTTONS #] 1
  144. END
  145.  
  146. TO MAYBEFALSIFY :WHO :WHAT
  147. IF NOT EQUALP (GPROP :WHO "CATEGORY) (GPROP :WHAT "CATEGORY) [FALSIFY :WHO :WHAT]
  148. END
  149.  
  150. TO PEERS :WHO
  151. OUTPUT THING GPROP :WHO "CATEGORY
  152. END
  153.  
  154. TO PERMS :N :R
  155. IF EQUALP :R 0 [OUTPUT 1]
  156. OUTPUT :N * PERMS :N-1 :R-1
  157. END
  158.  
  159. TO PROBLEM
  160. CATEGORY "FIRST [JANE LARRY OPAL PERRY]
  161. CATEGORY "LAST [IRVING KING MENDLE NATHAN]
  162. CATEGORY "AGE [32 38 45 55]
  163. CATEGORY "JOB [DRAFTER PILOT SERGEANT DRIVER]
  164. DIFFER [JANE KING LARRY NATHAN]
  165. SAYS "JANE "IRVING 45
  166. SAYS "KING "PERRY "DRIVER
  167. SAYS "LARRY "SERGEANT 45
  168. SAYS "NATHAN "DRAFTER 38
  169. DIFFER [MENDLE JANE OPAL NATHAN]
  170. SAYS "MENDLE "PILOT "LARRY
  171. SAYS "JANE "PILOT 45
  172. SAYS "OPAL 55 "DRIVER
  173. SAYS "NATHAN 38 "DRIVER
  174. PRINT []
  175. SOLUTION
  176. END
  177.  
  178. TO SAYS :WHO :WHAT1 :WHAT2
  179. PRINT (LIST "SAYS :WHO :WHAT1 :WHAT2)
  180. LINK :WHO :WHAT1 :WHAT2
  181. LINK :WHO :WHAT2 :WHAT1
  182. END
  183.  
  184. TO SIMPLEX :BUTTONS
  185. OUTPUT 2 * F :BUTTONS
  186. END
  187.  
  188. TO SOCKS :LIST
  189. LOCAL [TOTAL MATCHING]
  190. MAKE "TOTAL COMBS (EXPAND :LIST) 2
  191. MAKE "MATCHING FILTER [EQUALP FIRST ? LAST ?] :TOTAL
  192. PR (SE [THERE ARE] COUNT :TOTAL [POSSIBLE PAIRS OF SOCKS.])
  193. PR (SE [OF THESE,] COUNT :MATCHING [ARE MATCHING PAIRS.])
  194. PR SE [PROBABILITY OF MATCH =] ~
  195.       WORD (100 * (COUNT :MATCHING)/(COUNT :TOTAL)) "%
  196. END
  197.  
  198. TO SOCKTEST
  199. LOCAL [FIRST SECOND]
  200. MAKE "FIRST PICK [BROWN BROWN BROWN BROWN BROWN BROWN BLUE BLUE BLUE BLUE]
  201. MAKE "SECOND ~
  202.      PICK (IFELSE EQUALP :FIRST "BROWN ~
  203.                   [[BROWN BROWN BROWN BROWN BROWN BLUE BLUE BLUE BLUE]] ~
  204.                   [[BROWN BROWN BROWN BROWN BROWN BROWN BLUE BLUE BLUE]])
  205. OUTPUT EQUALP :FIRST :SECOND
  206. END
  207.  
  208. TO SOLUTION
  209. FOREACH THING FIRST :CATEGORIES [SOLVE1 ? BF :CATEGORIES]
  210. END
  211.  
  212. TO SOLVE1 :WHO :ORDER
  213. TYPE :WHO
  214. FOREACH :ORDER [TYPE CHAR 32 TYPE GPROP :WHO ?]
  215. PRINT []
  216. END
  217.  
  218. TO STORE :A :B :VAL
  219. STOREINORDER :A :B :VAL :CATEGORIES
  220. END
  221.  
  222. TO STOREINORDER :A :B :VAL :ORDER
  223. IF EMPTYP :ORDER [PRINT (SE [UNKNOWN OBJECTS] :A :B) THROW "TOPLEVEL]
  224. IF MEMBERP :A THING FIRST :ORDER [PPROP :A :B :VAL STOP]
  225. IF MEMBERP :B THING FIRST :ORDER [PPROP :B :A :VAL STOP]
  226. STOREINORDER :A :B :VAL BF :ORDER
  227. END
  228.  
  229. TO T :N :K
  230. IF EQUALP :K 0 [OUTPUT 1]
  231. IF EQUALP :N 0 [OUTPUT 0]
  232. OUTPUT (T :N :K-1)+(T :N-1 :K)
  233. END
  234.  
  235. TO TWOTO :POWER
  236. OUTPUT CASCADE :POWER [2 * ?] 1
  237. END
  238.  
  239. TO VERIFY :WHO :WHAT
  240. LOCAL "OLDVALUE
  241. MAKE "OLDVALUE GET :WHO :WHAT
  242. IF EQUALP :OLDVALUE "TRUE [STOP]
  243. IF EQUALP :OLDVALUE "FALSE ~
  244.    [PR (SE [INCONSISTENCY VERIFYING] :WHO "IS :WHAT) THROW "TOPLEVEL]
  245. PR (LIST "VERIFY :WHO :WHAT)
  246. STORE :WHO :WHAT "TRUE
  247. PPROP :WHO (GPROP :WHAT "CATEGORY) :WHAT
  248. PPROP :WHAT (GPROP :WHO "CATEGORY) :WHO
  249. IF NOT EMPTYP :OLDVALUE [LINKTRUE :OLDVALUE]
  250. FINDFALSE (PEERS :WHO) :WHAT
  251. FINDFALSE (PEERS :WHAT) :WHO
  252. FOREACH (GPROP :WHO "TRUTH) [VERIFY ? :WHAT]
  253. FOREACH (GPROP :WHAT "TRUTH) [VERIFY :WHO ?]
  254. FOREACH (GPROP :WHO "FALSEHOOD) [MAYBEFALSIFY ? :WHAT]
  255. FOREACH (GPROP :WHAT "FALSEHOOD) [MAYBEFALSIFY :WHO ?]
  256. PPROP :WHO "TRUTH (FPUT :WHAT GPROP :WHO "TRUTH)
  257. PPROP :WHAT "TRUTH (FPUT :WHO GPROP :WHAT "TRUTH)
  258. END
  259.